﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Bitacora;
using EntitiesLayer;
using DataLayer;

namespace BusinessLayer
{
    /// <summary>
    /// 
    /// </summary>
    public static class ImporterManager
    {
        /// <summary>
        /// 
        /// </summary>
        public static void SubirCheques()
        {
            if (CorrectTime())
            {

                Services.EnviarLog("Unisys Batch Importer To IIF", 501, "Reanudando Ciclo Servicio de Carga...", "SubirCheques", Bitacora.TipoError.Log, null, Acciones.Iniciar_Servicio);

                Services.EnviarLog("Unisys Batch Importer To IIF", 502, "Leyendo Documentos de la Base de Datos...", "SubirCheques", Bitacora.TipoError.Informacion);
                MailMessage mail = new MailMessage();

                List<Cheque> chequesXSubir = SqlDataClass.SQLReadToIIF();

                if (chequesXSubir != null)
                {
                    if (chequesXSubir.Count == 0)
                    {
                        Services.EnviarLog("Unisys Batch Importer To IIF", 503, "No se encontraron documentos por procesar","SubirCheques", Bitacora.TipoError.Informacion);
                        Services.EnviarLog("Unisys Batch Importer To IIF", 505, "Ciclo de carga finalizado...", "SubirCheques", Bitacora.TipoError.Log, null, Acciones.Fin_Proceso);
                        return;
                    }
                    

                    mail.documentosXProcesar = chequesXSubir.Count;

                    Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Existen " + mail.documentosXProcesar + " pendientes de procesar", "SubirCheques", Bitacora.TipoError.Proceso, null, Acciones.Fin_Proceso, mail.documentosXProcesar);

                    List<Cheque> chequesAReintentar = new List<Cheque>();// los que fallan se reintentan
                    IIF_WorkItem infoImage = null;
                    try
                    {
                    infoImage = new IIF_WorkItem();
                    }
                    catch (Exception e)
                    {
                        Services.EnviarLog("Unisys Batch Importer To IIF", 205, "Imposible conectar con InfoImage", "SubirCheques", Bitacora.TipoError.Error, e,Acciones.Fallo_Conectar_IIF);
                        return;
                    }

                    foreach (Cheque cheque in chequesXSubir)
                    {
                        try
                        {
                            if (infoImage.CrearWorkItem(cheque))
                            {
                                mail.documentosOk++;
                                SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 3, false);
                            }
                            else
                            {
                                mail.documentosNoOk++;
                                chequesAReintentar.Add(cheque);
                                if (cheque.estado == 1 || cheque.estado == 4)
                                    SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 4);
                                else
                                    SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 6);
                            }
                        }
                        catch (Exception e)
                        {
                            Services.EnviarLog("Unisys Batch Importer To IIF", 204, "Error Inesperado: ", "SubirCheques", Bitacora.TipoError.Error, e);
                            mail.documentosNoOk++;
                            chequesAReintentar.Add(cheque);
                            if (cheque.estado == 1 || cheque.estado == 4)
                                SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 4);
                            else
                                SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 6);

                            continue;
                        }

                    }





                    Services.EnviarLog("Unisys Batch Importer To IIF", 511, "Reintentado Documentos","SubirCheques", Bitacora.TipoError.Informacion);
                    for (int i = 1; (i <= Configuracion.numeroReintentos) && (chequesAReintentar.Count > 0); i++)
                    {
                        infoImage.LimpiarEscritorioClienteIIF();

                        bool[] oks = new bool[chequesAReintentar.Count];
                        int j = 0;
                        foreach (Cheque cheque in chequesAReintentar)
                        {
                            try
                            {
                                if (infoImage.CrearWorkItem(cheque))
                                {
                                    //mail.documentsOk++;
                                    oks[j] = true;
                                    SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 3, false);
                                }
                                else
                                {
                                    if (i == Configuracion.numeroReintentos)
                                    {
                                        //mail.documentsNoOk++;
                                        if (cheque.estado == 1 || cheque.estado == 4)
                                            SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 4);
                                        else
                                            SqlDataClass.ActualizarEstado(cheque.IDCheque.ToString(), 6);
                                    }
                                    oks[j] = false;
                                }

                            }
                            catch (Exception e)
                            {
                                Services.EnviarLog("Unisys Batch Importer To IIF", 204, "Error Inesperado", "SubirCheques", Bitacora.TipoError.Error,e);
                                //mail.documentsNoOk++;
                                oks[j] = false;
                                continue;
                            }

                            j++;
                        }

                        for (int k = 0; k < oks.Length; k++)
                            if (oks[k])
                                chequesAReintentar.RemoveAt(k);
                    }

                    if (infoImage != null)
                    {
                        infoImage.LimpiarEscritorioClienteIIF();
                        infoImage.DesconectarClienteIIFExplicitamente();
                    }


                    #region sendStadistics

                    Services.EnviarLog("Unisys Batch Importer To IIF", 506, "Se procesaron " + mail.documentosXProcesar + " documentos que se encontraban pendientes, de ellos " + mail.documentosOk + " se procesaron correctamente y " + mail.documentosNoOk + " se procesaron incorrectamente","SubirCheques",Bitacora.TipoError.Informacion);
                    Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Documentos no procesados: "+mail.documentosNoOk, "SubirCheques",Bitacora.TipoError.Error,  null);
                    Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Documentos Procesados Correctamente: "+mail.documentosOk,"SubirCheques", Bitacora.TipoError.Proceso);

                    try
                    {
                        mail.EnviarMensaje();
                    }
                    catch (Exception e)
                    {
                        Services.EnviarLog("Unisys Batch Importer To IIF", 51, "Imposible enviar email ","SubirCheques", Bitacora.TipoError.Error, e);
                    }

                    #endregion

                    Services.EnviarLog("Unisys Batch Importer To IIF",505, "Ciclo de carga finalizado...","SubirCheques", Bitacora.TipoError.Log,null,Acciones.Fin_Proceso);

                }
                else
                {
                    Services.EnviarLog("Unisys Batch Importer To IIF", 151, "Error inesperado al leer documentos para subirlos a InfoImage", "SubirCheques", Bitacora.TipoError.Error);
                    Services.EnviarLog("Unisys Batch Importer To IIF", 505, "Ciclo de carga finalizado...", "SubirCheques", Bitacora.TipoError.Log, null, Acciones.Fin_Proceso);
                    return;
                }
            }
            else
            {
                Services.EnviarLog("Unisys Batch Importer To IIF", 260, "Se acabo el tiempo de ejecución del servicio", "SubirCheques", Bitacora.TipoError.Informacion);
                return;
            }


        }

        /// <summary>
        /// Revisa que la hora de ejecucion sea la correcta
        /// </summary>
        /// <returns>True, si el tiempo se encuentra dentro de la hora especificada en la configuracion.</returns>
        private static bool CorrectTime()
        {
            int horaInicio = Int32.Parse(Configuracion.horarioEjecucion[1]);
            int horaFin = Int32.Parse(Configuracion.horarioEjecucion[2]);


            int horaActual = Int32.Parse(DateTime.Now.ToString("HHmm"));
           
            if ((horaInicio < horaActual) && (horaActual < horaFin))
            {
                return true;
            }
            else
            {
                return false;
            }


        }
    }
}
